﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyFinanceManager.Objects
{
    public class RepositoryCenter
    {
        #region Fields
        private CatItem cExpenses;
        private CatItem cEarnings;
        #endregion

        #region Property
        /// <summary>
        /// Gets the expenses categorized
        /// </summary>
        /// <value>The expenses.</value>
        internal CatItem ExpensesCategorized
        {
            get { return cExpenses; }
        }
        /// <summary>
        /// Gets the earnings categorized
        /// </summary>
        /// <value>The earnings.</value>
        internal CatItem EarningsCategorized
        {
            get { return cEarnings; }
        }


        /// <summary>
        /// Gets the expenses.
        /// </summary>
        /// <value>The expenses.</value>
        internal List<PostingRecord> Expenses
        {
            get { return Database.Db.Expenses; }
        }

        /// <summary>
        /// Gets the earnings.
        /// </summary>
        /// <value>The earnings.</value>
        internal List<PostingRecord> Earnings
        {
            get { return Database.Db.Earnings; }
        }

        /// <summary>
        /// Gets the transfers.
        /// </summary>
        /// <value>The transfers.</value>
        internal List<TransferRecord> Transfers
        {
            get { return Database.Db.Transfers; }
        }
        /// <summary>
        /// Gets the fuels.
        /// </summary>
        /// <value>The fuels.</value>
        internal List<FuelRecord> Fuels
        {
            get { return Database.Db.Fuels; }
        }
        #endregion

        #region Singleton
        private static RepositoryCenter repositoy;
        /// <summary>
        /// Gets the repositoy and creates it if necessary [Singleton]
        /// </summary>
        /// <value>The repositoy.</value>
        public static RepositoryCenter Repositoy
        {
            get
            {
                if (RepositoryCenter.repositoy == null)
                    RepositoryCenter.repositoy = new RepositoryCenter();
                return RepositoryCenter.repositoy;
            }
        }
        #endregion

        #region Constructor
        /// <summary>
        /// Initializes a new instance of the <see cref="RepositoryCenter"/> class.
        /// </summary>
        private RepositoryCenter()
        {
            CreateExpenses();
            CreateEarnings();

            SortPostingRecords(Database.Db.Earnings, cEarnings);
            SortPostingRecords(Database.Db.Expenses, cExpenses);
        }
        #endregion

        #region Methods
        /// <summary>
        /// Sorts the posting records into different categories
        /// </summary>
        /// <param name="list">The list.</param>
        /// <param name="cMain">The c main.</param>
        private static void SortPostingRecords(List<PostingRecord> list, CatItem cMain)
        {
            foreach (var item in list)
            {
                CatItem ci = null;

                if (!String.IsNullOrEmpty(item.SubCategoryName))
                    ci = cMain.Find(item.SubCategoryName);

                if (ci == null)
                    ci = cMain.Find(item.CategoryName);

                if (ci == null)
                    ci = cMain.Find("Unkategorisiert");
                ci.Records.Add(item);
            }
        }

        /// <summary>
        /// Creates the expenses.
        /// </summary>
        private void CreateExpenses()
        {
            CatItem ciMain = CreateCatItem(Filenames.FilenameCategoryEx);

            this.cExpenses = ciMain;

            #region old
            //#region 1. Reihe
            //CatItem ciPC = cExpenses.Add("PC");
            //ciPC.Add("Zubehör für Notebook");
            //ciPC.Add("Zubehör für Server");
            //ciPC.Add("Zubehör für SmartPhone");


            //CatItem ciMiete = cExpenses.Add("Miete");
            //ciMiete.Add("Strom");
            //ciMiete.Add("Wärme");
            //ciMiete.Add("Garage");
            //ciMiete.Add("Sonstiges");

            //CatItem ciVers = cExpenses.Add("Versicherung");
            //ciVers.Add("Lebensversicherung");
            //ciVers.Add("Krankenversicherung");
            //ciVers.Add("Autoversicherung");

            //CatItem ciMedien = cExpenses.Add("Medien");
            //ciMedien.Add("DVD");
            //ciMedien.Add("CD");
            //ciMedien.Add("Buch");
            //ciMedien.Add("Zeitschrift");
            //ciMedien.Add("Zeitung");

            //#endregion
            //#region 2. Reihe
            //cExpenses.Add("Kino");
            //CatItem ciEssen = cExpenses.Add("Essen");
            //ciEssen.Add("Essen (getrennt)");
            //ciEssen.Add("Essen (zusammen)");
            //ciEssen.Add("Fastfood");
            //CatItem ciKaffee = cExpenses.Add("Kaffee");
            //ciKaffee.Add("Kneipe");
            //ciKaffee.Add("Bar");
            //ciKaffee.Add("Club");
            //ciKaffee.Add("Frühstück");
            //CatItem ciUrlaub = cExpenses.Add("Urlaub");
            //ciUrlaub.Add("Konzert");
            //ciUrlaub.Add("Hotel");
            //ciUrlaub.Add("Mietwagen");
            //ciUrlaub.Add("Eintritt");
            //ciUrlaub.Add("Erinnerungen");
            //#endregion
            //#region 3. Reihe
            //CatItem ciKleidung = cExpenses.Add("Kleidung");
            //ciKleidung.Add("T-Shirts");
            //ciKleidung.Add("Polo");
            //ciKleidung.Add("Hemd");
            //ciKleidung.Add("Anzug");
            //ciKleidung.Add("Hose");
            //ciKleidung.Add("Jacke");
            //ciKleidung.Add("Unterwäsche");
            //ciKleidung.Add("Sommersachen");
            //ciKleidung.Add("Wintersachen");

            //CatItem ciSchuhe = cExpenses.Add("Schuhe");
            //ciSchuhe.Add("Sneakers");
            //ciSchuhe.Add("Lederschuhe");

            //CatItem ciIkea = cExpenses.Add("Einrichtungsgegenstände");
            //ciIkea.Add("Möbel");
            //ciIkea.Add("Blumen");
            //ciIkea.Add("Geschirr");
            //ciIkea.Add("Kleinzeugs");

            //CatItem ciSport = cExpenses.Add("Sport");
            //ciSport.Add("Sportgeräte");
            //ciSport.Add("Sporteintritte");
            //ciSport.Add("Sportveranstaltungen");

            //#endregion
            //#region 4. Reihe
            //cExpenses.Add("Nahrungsmittel");

            //cExpenses.Add("Süßigkeiten");

            //cExpenses.Add("Getränke");

            //CatItem ciGeschenke = cExpenses.Add("Geschenke");
            //ciGeschenke.Add("Mitbringsel");
            //ciGeschenke.Add("Geburtstagsgeschenk");
            //ciGeschenke.Add("Weihnachtsgeschenk");

            //#endregion
            //#region 5. Reihe
            //CatItem ciAuto = cExpenses.Add("Auto");
            //ciAuto.Add("Benzin");
            //ciAuto.Add("Autowartung");
            //ciAuto.Add("Autopflege");

            //CatItem ciReisen = cExpenses.Add("Reisen");
            //ciReisen.Add("Bus");
            //ciReisen.Add("Flugzeug");
            //ciReisen.Add("Bahn");

            //CatItem ciHaushalt = cExpenses.Add("Haushaltsartikel");
            //ciHaushalt.Add("Reinigungsmittel");

            //CatItem ciPflege = cExpenses.Add("Pflege");
            //ciPflege.Add("Duschgel");
            //ciPflege.Add("Deo");
            //ciPflege.Add("Rasierzeug");
            //ciPflege.Add("Zahnpasta");
            //ciPflege.Add("Zubehör für Zahnbürste");
            //ciPflege.Add("Zubehör für Rasierapparat");
            //ciPflege.Add("Rasierklingen");
            //#endregion
            #endregion

            cExpenses.Add("Unkategorisiert");
        }

        private static CatItem CreateCatItem(string filename)
        {
            CatItem ciMain = new CatItem();
            try
            {
                List<CatInfo> cis = Helper.Load(filename);
                List<CatInfo> cisCat0 = Helper.GetSubCatInfos(0, cis);
                for (int i = 0; i < cisCat0.Count; i++)
                {
                    var item = cisCat0[i];
                    CatItem cItem = ciMain.Add(item.Name);
                    // i+1 da zerobased
                    foreach (var innerItems in Helper.GetSubCatInfos(i + 1, cis))
                    {
                        cItem.Add(innerItems.Name);
                    }
                }
            }
            catch
            {
                throw;
            }

            return ciMain;
        }

        /// <summary>
        /// Creates the earnings.
        /// </summary>
        private void CreateEarnings()
        {
            CatItem ciMain = CreateCatItem(Filenames.FilenameCategoryIn);

            this.cEarnings = ciMain;
            #region old
            //#region 1. Reihe
            //cEarnings.Add("Geburtstagsgeschenk");
            //cEarnings.Add("Weihnachtsgeschenk");
            //cEarnings.Add("Geschenk von Verwandten");

            //#endregion
            //#region 2. Reihe
            //cEarnings.Add("Geld für Gefälligkeiten");
            //#endregion
            //#region 3. Reihe
            //cEarnings.Add("Sonstige Einnahmen");
            //#endregion
            #endregion
            cEarnings.Add("Unkategorisiert");
        }

        internal void Save()
        {
            Database.Db.Save();
        }
        #endregion
    }
}